Capitolo 4 - una nuova speranza...

Concludere ieri


In [76]:
l = [1,2,3,4, 800, 40, 73, 8]
ll = [x*2 for x in l]
# ll = [2, 4, 6, 8, 1600, 80, 146, 16]

# list(enumerate(l))
{ k: k*2 for k in l }
ll.append("pippo")
zip(l, ll, ll, ll)

{ pippo: v for k,v,pippo in zip(l, ll, ll) }

x,y,z = 1,5,10


Out[76]:
{2: 2, 4: 4, 6: 6, 8: 8, 16: 16, 80: 80, 146: 146, 1600: 1600}

Operatore "is"


In [83]:
import copy
x = [10, 3, 9]
y = copy.copy(x)
print("\n# y = copy.copy(x)")
print("x is y? {}".format(x is y))
print("x == y? {}".format(x == y))
print(id(x), id(y))


# y = copy.copy(x)
x is y? False
x == y? True
(57176712L, 61642760L)

In [9]:
# Verifica l'identità di un oggetto
x = False
print("x is False? {}".format(x is False))
print(id(x), id(False))

x = 10
print("\nx is 10? {}".format(x is 10))
print(id(x), id(10))

x = [10, 3, 9]
y = x
print("\n# y = x")
print("x is y? {}".format(x is y))
print(id(x), id(y))
      
import copy
x = [10, 3, 9]
y = copy.copy(x)
print("\n# y = copy.copy(x)")
print("x is y? {}".format(x is y))
print("x == y? {}".format(x == y))
print(id(x), id(y))


x is False? True
(505971624L, 505971624L)

x is 10? True
(6126144L, 6126144L)

# y = x
x is y? True
(60189000L, 60189000L)

# y = copy.copy(x)
x is y? False
x == y? True
(58541768L, 60189064L)

BONUS: stipendi random(!)


In [2]:
import random

r = lambda : int(random.random()*3000)

# Uguale a
# def r():
#     return int(random.random()*3000)

PEOPLE = [
    {"name": "Luca", "city": "Fabriano", "salary": r()},
    {"name": "Simone", "city": "Fabriano", "salary": r()},
    {"name": "Elena", "city": "Mondavio", "salary":r()},
    {"name": "Gianluca", "city": "Senigallia", "salary": r()},
    {"name": "Monica", "city": "Roma", "salary": r()},
{"name": "Sonia", "city": "Bari", "salary": r()},
{"name": "Patrizia", "city": "Bari", "salary": r()},]

PEOPLE


Out[2]:
[{'city': 'Fabriano', 'name': 'Luca', 'salary': 1544},
 {'city': 'Fabriano', 'name': 'Simone', 'salary': 292},
 {'city': 'Mondavio', 'name': 'Elena', 'salary': 767},
 {'city': 'Senigallia', 'name': 'Gianluca', 'salary': 2159},
 {'city': 'Roma', 'name': 'Monica', 'salary': 238},
 {'city': 'Bari', 'name': 'Sonia', 'salary': 570},
 {'city': 'Bari', 'name': 'Patrizia', 'salary': 2099}]

Raggruppare gli elementi per città


In [102]:
city_map = {}
for p in PEOPLE:
    city = p["city"]
    city_map[city] = city_map.get(city, [])
    city_map[city].append(p)
    
import pprint
pprint.pprint(city_map)


{'Bari': [{'city': 'Bari', 'name': 'Sonia', 'salary': 479},
          {'city': 'Bari', 'name': 'Patrizia', 'salary': 2157}],
 'Fabriano': [{'city': 'Fabriano', 'name': 'Luca', 'salary': 587},
              {'city': 'Fabriano', 'name': 'Simone', 'salary': 59}],
 'Mondavio': [{'city': 'Mondavio', 'name': 'Elena', 'salary': 1478}],
 'Roma': [{'city': 'Roma', 'name': 'Monica', 'salary': 531}],
 'Senigallia': [{'city': 'Senigallia', 'name': 'Gianluca', 'salary': 851}]}

In [98]:
class DictList(dict):

     def get(self, k, default=None):
         if k not in self:
            self[k] = []
         return super(DictList, self).get(k, default)

     def __getitem__(self, k):
         if k not in self:
            # self[k] = []
            super(DictList, self).__setitem__(k, [])
            
         return super(DictList, self).__getitem__(k)
        
city_map = DictList()
l = city_map.get("pippo")
print(city_map)


{'pippo': []}

In [101]:
city_map = DictList()
for p in PEOPLE:
    city = p["city"]
    # city_map[city] = city_map.get(city, [])
    city_map.get(city).append(p)
    
import pprint
pprint.pprint(city_map)


{'Bari': [{'city': 'Bari', 'name': 'Sonia', 'salary': 479},
          {'city': 'Bari', 'name': 'Patrizia', 'salary': 2157}],
 'Fabriano': [{'city': 'Fabriano', 'name': 'Luca', 'salary': 587},
              {'city': 'Fabriano', 'name': 'Simone', 'salary': 59}],
 'Mondavio': [{'city': 'Mondavio', 'name': 'Elena', 'salary': 1478}],
 'Roma': [{'city': 'Roma', 'name': 'Monica', 'salary': 531}],
 'Senigallia': [{'city': 'Senigallia', 'name': 'Gianluca', 'salary': 851}]}

BONUS: Ordinamento per chiave del dizionario


In [109]:
# def get_name(x):
#    return (x["city"], x["name"]) 
# PEOPLE.sort(key=get_name)

PEOPLE.sort(key=lambda x: (x["city"], x["name"]))

PEOPLE


Out[109]:
[{'city': 'Bari', 'name': 'Patrizia', 'salary': 2157},
 {'city': 'Bari', 'name': 'Sonia', 'salary': 479},
 {'city': 'Fabriano', 'name': 'Luca', 'salary': 587},
 {'city': 'Fabriano', 'name': 'Simone', 'salary': 59},
 {'city': 'Mondavio', 'name': 'Elena', 'salary': 1478},
 {'city': 'Roma', 'name': 'Monica', 'salary': 531},
 {'city': 'Senigallia', 'name': 'Gianluca', 'salary': 851}]

In [17]:
PEOPLE.sort(key=lambda x: x["salary"])
PEOPLE


Out[17]:
[{'city': 'Fabriano', 'name': 'Luca', 'salary': 3},
 {'city': 'Fabriano', 'name': 'Simone', 'salary': 10},
 {'city': 'Mondavio', 'name': 'Elena', 'salary': 15},
 {'city': 'Senigallia', 'name': 'Gianluca', 'salary': 15},
 {'city': 'Roma', 'name': 'Monica', 'salary': 20},
 {'city': 'Bari', 'name': 'Patrizia', 'salary': 20},
 {'city': 'Bari', 'name': 'Sonia', 'salary': 20}]

Classi che prendono in input fname


In [26]:
# v. gestionale/managers01/

In [119]:
class BaseManager(object):
    def do_export(self, rows):
        self.__privateattr = "PRIVATO"
        print(u"Esporto qualcosa per te")
        rv = self._internal_do_export(rows)
        return rv
    
class FileManager(BaseManager):
    def _internal_do_export(self, rows):
        print(self.__privateattr)
        print(u"ti esporto")
        
class ExtraFileManager(FileManager):
    def _internal_do_export(self, rows):
        print(u"ti esporto extra")

        
mymanager = FileManager()
mymanager.do_export([1,2])
mymanger.__privateattr


Esporto qualcosa per te
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-119-a9a4533ad29d> in <module>()
     17 
     18 mymanager = FileManager()
---> 19 mymanager.do_export([1,2])
     20 mymanger.__privateattr

<ipython-input-119-a9a4533ad29d> in do_export(self, rows)
      3         self.__privateattr = "PRIVATO"
      4         print(u"Esporto qualcosa per te")
----> 5         rv = self._internal_do_export(rows)
      6         return rv
      7 

<ipython-input-119-a9a4533ad29d> in _internal_do_export(self, rows)
      8 class FileManager(BaseManager):
      9     def _internal_do_export(self, rows):
---> 10         print(self.__privateattr)
     11         print(u"ti esporto")
     12 

AttributeError: 'FileManager' object has no attribute '_FileManager__privateattr'

In [131]:
t = list((row[k] for k in ("name", "city", "salary")))

Decoratori


In [150]:
# **row

def wrappitto(f):
    print("Prima di eseguirti...")
    rv = f
    print("...Dopo l'esecuzione")
    return rv

@wrappitto
def hello(who="a chi?"):
    print("Ciao {}".format(who))

hello()


Prima di eseguirti...
...Dopo l'esecuzione
Ciao a chi?

In [151]:
def wrappitto(f):
    
    def myfun(*args, **kwargs):
        print("Prima di eseguirti...")
        rv = f(*args, **kwargs)
        print("...Dopo l'esecuzione")
        return rv 
    
    return myfun

# hello = wrappitto(hello)
# hello = myfun
# hello(who="pippo")

@wrappitto
def hello(who="a chi?"):
    print("Ciao {}".format(who))

hello()


Prima di eseguirti...
Ciao a chi?
...Dopo l'esecuzione

In [185]:
def myprint(*args):
    for i, arg in enumerate(args):
        print("argomento {} = {}".format(i, arg))

def myprint_by_kw(*args, **kw):
    l = kw.values() + list(args)
    print("{} ".format(*args))

# myprint("ciao", "pippo", 1, {1:"bue"})
myprint_by_kw("ciao", name="pippo", city="Fabriano", salary=1)

print(1,2,3)
l = [1,2,3]
print(l)


ciao 
(1, 2, 3)
[1, 2, 3]

In [186]:
"{name}".format(name="pippo")


Out[186]:
'pippo'

In [187]:
d = {"name": "pippo"}
"{name}".format(**d)


Out[187]:
'pippo'

In [190]:
l = [1,2]
"{} {}".format(*l)


Out[190]:
'1 2'

In [193]:
def myfun():
    """
    la mia docstring
    """
    print("ciao")
    
myfun.__doc__
myfun.__name__


Out[193]:
'myfun'

In [30]:
# v. managers03/base.py , decori.py e db.py

Profilazione del codice con i decoratori


In [31]:
from functools import wraps 

def profileme(f):
    start = time.time()
    @wraps
    def wrapper(*args, **kw):
        return f(*args, **kw)
    stop = time.time()
    print("Tempo {} secondi".format(stop-start))
    return wrapper

v. anche modulo timeit

v. memory_profiler di terze parti

Testare con Unittest


In [ ]:
# v. modulo unittest

Multithread


In [ ]:
# v. modulo threading